O código abaixo, é a classe de leitura que desenvolvemos para auxiliar nos processos de leitura de dados. No entantoa última versão, não realizava a leitura novamente de um valor caso ocorresse uma exceção.
Estude o método lerValorInteiro() para verificar a alteração realizada conforme destacado de verde. Esta modificação criou o seguinte comportamento: quando o usuário vai digitar um valor inteiro que o código está usando o método lerValorInteiro() e ele digita uma string ao invés de um dígito, ocorre uma exceção que é trada pelo Catch. Na versão anterior, o código simplesmente parava e dava a mensagem dizendo que o usuário digitou um valor inválido. Agora nesta versão, utilizamos uma estrutura de repetição do tipo Do While() para ler novamente um novo valor, e isto irá ocorrer até que o usuário digite um valor correto.
Faça agora a mesma implementação para os demais métodos: lerValorFloat(), lerValorDouble(), lerValorShort(), lerValorLong() ...
import java.util.Scanner;
public class Leitura {
static Scanner teclado = new Scanner(System.in);
static void limparBuffer() {
if (teclado.hasNextLine()) {
teclado.nextLine();
}
}
// ---------- TIPOS NUMÉRICOS ----------
static int lerValorInteiro(String mensagem) {
int valor = 0;
// essa variavel ira controlar se houve algum problema na leitura
// conhecida na programacao como variavel "flag"
boolean leituraComProblema = true;
do {
try {
System.out.print(mensagem);
valor = teclado.nextInt();
leituraComProblema = false;
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
} while (leituraComProblema);
return valor;
}
static float lerValorFloat(String mensagem) {
float valor = 0;
try {
System.out.print(mensagem);
valor = teclado.nextFloat();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
return valor;
}
static double lerValorDouble(String mensagem) {
double valor = 0;
try {
System.out.print(mensagem);
valor = teclado.nextDouble();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
return valor;
}
static long lerValorLong(String mensagem) {
long valor = 0;
try {
System.out.print(mensagem);
valor = teclado.nextLong();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
return valor;
}
static short lerValorShort(String mensagem) {
short valor = 0;
try {
System.out.print(mensagem);
valor = teclado.nextShort();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
return valor;
}
static byte lerValorByte(String mensagem) {
byte valor = 0;
try {
System.out.print(mensagem);
valor = teclado.nextByte();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
} finally {
limparBuffer();
}
return valor;
}
// ---------- TIPOS TEXTUAIS ----------
static String lerValorString(String mensagem) {
String valor = "";
try {
System.out.print(mensagem);
valor = teclado.nextLine();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
}
return valor;
}
static char lerValorChar(String mensagem) {
char valor = '\0';
try {
System.out.print(mensagem);
String entrada = teclado.nextLine();
if (entrada.length() > 0) {
valor = entrada.charAt(0);
}
} catch (Exception e) {
System.out.println("Valor digitado é incorreto.");
}
return valor;
}
// ---------- TIPOS LÓGICOS ----------
static boolean lerValorBoolean(String mensagem) {
boolean valor = false;
try {
System.out.print(mensagem);
valor = teclado.nextBoolean();
} catch (Exception e) {
System.out.println("Valor digitado é incorreto. Digite true ou false.");
} finally {
limparBuffer();
}
return valor;
}
}
asdf